Osci RenderでLuaを使う
ソースコードから確認するには、osci-render.jucer内に記載されている
JUCE用のアプリケーションProjucerから開いて View > Show Project Settings / あるいは同ファイルのソースコードのヘッダーからも確認可能
使用フレームワーク : JUCE (C++ のオーディオ系開発用フレームワーク)
VSTとかスタンドアロンアプリとかが開発しやすくなる
Osci Render Lua
Lua Version : 5.4.5 (Source/lua/lua.h)
初めての人はこれで概要をつかめる
もうちょっと細かいLuaのドキュメント
リンク先は公式というより他の方にフォークされたもので、執筆時点ではフォーク版の方が最新情報に更新されているため掲載。場合によっては作者(James H Ball氏)のWiki(Github)を参照するといいかもしれない。 もともと使えるLua変数(LuaParser.cpp の setGlobalVariablesに記載)
step
初期値:1
1sampleにつき1ずつ数値が増えていく
つまり、サンプルレートが48000s/sの場合、1秒間に48000回数値が増えていく
たとえばprint ( step / sample_rate )でコンソール画面を見ると、1秒間に1ずつ増えていく様子が分かる
※ちなみにコンソール画面は分かりづらいが、Luaのコードを書く部分の下に<LuaConsole>というタブがあるので、それをクリックするとコンソール画面が開く
https://gyazo.com/6297938d719ad9e881175c69b658cdfc
公式ではoutdatedな変数として見なされている。かわりにphaseやfrequency、sample_rateを使うといい。
phase
初期値:0
周波数に応じて一定の周期でループする
周波数が高くなれば周期が速くなり、周波数が低くなれば周期が遅くなる
なにがいいかといえば、たとえばサイン波を作りたいときに、stepを使うと画面上で設定する周波数によらず一定だが、phaseであれば同期されるので、直感的にわかりやすい
値は 0 ~ 2π の間で、2πを越えると0にリセットされる
ソースコード(LuaParser.cpp)にある数式を簡単に見ると
( phase ) += 2π × freq. / sampleRate
となっており
<0 ~ 2π>を1ループとして、それが周波数freqの分だけ1秒間に繰り返される
例えば わかりやすく 1Hz としてやると、0 ~ 2π ( 0 ~ 6.28 )のループが1秒ごとに繰り返される
https://gyazo.com/288e82fb46ad55cbd0f20bb00747ccf0
sample_rate
初期値:0
そのサンプルレートが変数として使える
frequency
初期値:0
Osci Render上で設定した周波数が変数として使える
x
y
z
Osci Render のLua関数
sliderと組み合わせればアニメーションも可能
osci_line()
https://gyazo.com/1b563ee83a070b9dec9180fe2545c606
code:osci_line
a = slider_a *2 -1
b = slider_b *2 -1
c = slider_c *2 -1
d = slider_d *2 -1
start = { a, b }
finish = { c, d }
line = osci_line(phase, start, finish)
return line
osci_rect() 長方形
https://gyazo.com/6cec50be6c341da3893ab5fced5ebc80
code:osci_rect
width = slider_a
height = slider_b
rect = osci_rect(phase, width, height)
return rect
osci_square() 正方形
https://gyazo.com/c94133145cb18624b6a6e4bc46b2736e
code:osci_square
width = slider_a
square = osci_rect(phase, width, width)
return square
osci_arc()
https://gyazo.com/d02d034f65fbeb1f1c92b1173e911903
code:osci_arc
radius_x = slider_a
radius_y = slider_b
start_angle = slider_c * 2 * math.pi
end_angle = slider_d * 2 * math.pi
arc = osci_arc(phase, radius_x, radius_y, start_angle, end_angle)
return arc
https://scrapbox.io/files/66f975b7b68d06001c3b0ada.mp4
上の音声波形をYTモードでも表示させたらかわいくて撮ってしまった...
osci_ellipse()
osci_circle()
osci_polygon()
osci_bezier()
osci_lissajous()
osci_square_wave()
osci_saw_wave()
osci_triangle_wave()
osci_mix()
osci_translate()
osci_scale()
osci_rotate()
print()
clear()
Luaのライブラリ
math.sin()やmath.floorなどが使える